#!/bin/sh

# JagaSama
# Mencadangkan dan membarui direktori rumah saat login atau startup sistem

# Lisensi: GPL v2

# Oleh eshabe
# eshabe@gmail.com
# 15 Mei 2008
# 16 Mei 2008
# --exclude=.profile di "reload"

# berkas yg harus ada: /etc/jagasama.conf
# berkas ini seharusnya adalah: /usr/sbin/jagasama
# berkas ini seharusnya ditautkan simbolik di /etc/init.d/jagasama
# 

opsi=$1
siapasaya=`whoami`
versi='0.1d2'
CONFIG_FILE='/etc/jagasama.conf'
JS_LOG='/tmp/jagasama.log'

read_config()
{
	awk -v MKEY=$1 '{
	i = index($0, "#");
	if (i){ Str=substr($0,1, i-1); }
	else { Str = $0; }
	if (Str ne "")
	{
		#print MKEY;
		split (Str, A);
		if (A[1] == MKEY) { gsub(","," ",A[2]); print A[2]; exit; }
	}
	}' $CONFIG_FILE
}

periksa_profile()
{
	awk '{
	if (index ($0, "#JAGASAMA#"))
	{
		print "OK";
		exit;
	}
	}' /home/$1/.profile
}

pastikan_profile()
{
	adakah=`periksa_profile $1`
	if [ "$adakah" != "OK" ]
	then
	echo >> /home/$1/.profile
	echo "#JAGASAMA#" >> /home/$1/.profile
	echo "/usr/sbin/jagasama reload" >> /home/$1/.profile
	fi
	chown root /home/$1/.profile
	chmod 644 /home/$1/.profile
}

cmd_start()
{
	echo starting... >> $JS_LOG
	enable_reload=`read_config RELOAD`
	if [ $enable_reload = '1' ]
	then
		echo reload enabled. starting process is skiped. >> $JS_LOG
		return
	fi
	if [ $siapasaya != root ]
	then
		echo hanya root yg boleh menjalankan perintah ini
		return
	fi
	the_users=`read_config USERS`
	save_dir=`read_config SAVEDIR`
	do_erase=`read_config ERASE_DIR`
	save_dir=$save_dir/jagasama
	for n in $the_users
	do
		if [ $do_erase = '1' -a  "/home/$n" != "/home/" ]
		then
			echo erase /home/$n ...  >> $JS_LOG
			rm -rf /home/$n
		fi
		echo mengembalikan $n >> $JS_LOG
		tar -xvP --bzip2 --same-owner -f $save_dir/js.$n.tar.bz2 >> $JS_LOG
	done
}

cmd_reload()
{
	echo reloading $siapasaya... >> $JS_LOG
	enable_reload=`read_config RELOAD`
	if [ $enable_reload != '1' ]
	then
		echo reload disabled >> $JS_LOG
		return
	fi
	save_dir=`read_config SAVEDIR`
	save_dir=$save_dir/jagasama
	echo mengembalikan $siapasaya >> $JS_LOG
	tar -xvP --bzip2 --same-owner --exclude=.profile -f $save_dir/js.$siapasaya.tar.bz2 >> $JS_LOG
}

cmd_save()
{
	echo 'saving...' >> $JS_LOG
	if [ $siapasaya != root ]
	then
		echo hanya root yg boleh menjalankan perintah ini
		return
	fi
	the_users=`read_config USERS`
	save_dir=`read_config SAVEDIR`
	if [ ! -d $save_dir ]
	then
		echo tidak ada direktori $save_dir
		return
	fi
	save_dir=$save_dir/jagasama
	if [ ! -d $save_dir ]
	then
		mkdir $save_dir
	fi
	if [ ! -d $save_dir ]
	then
		echo tidak dapat membuat direktori $save_dir >> $JS_LOG
		return
	fi
		
	for n in $the_users
	do
		user_dir=/home/$n
		if [ -d $user_dir ]
		then
			pastikan_profile $n
			echo mencadangkan $user_dir >> $JS_LOG
			if [ -r $save_dir/js.$n.tar.bz2 ]
			then
				rm -f $save_dir/js.$n.tar.bz2
			fi
			tar -cvP --bzip2 --same-owner -f $save_dir/js.$n.tar.bz2 $user_dir >> $JS_LOG
		else
			echo $user_dir tidak ada >> $JS_LOG
		fi
	done
}

cmd_resave()
{
	echo resaving $1... >> $JS_LOG
	if [ "$1" = "" ]
	then
		echo Pengguna kosong!
		echo Gunakan: jagasama resave nama_pengguna
		return
	fi
	echo 
	if [ $siapasaya != root ]
	then
		echo hanya root yg boleh menjalankan perintah ini
		return
	fi
	save_dir=`read_config SAVEDIR`
	if [ ! -d $save_dir ]
	then
		echo tidak ada direktori $save_dir
		return
	fi
	save_dir=$save_dir/jagasama
	user_dir=/home/$1
	if [ -d $user_dir ]
	then
		pastikan_profile $1
		echo mencadangkan $user_dir >> $JS_LOG
		if [ -r $save_dir/js.$1.tar.bz2 ]
		then
			rm -f $save_dir/js.$1.tar.bz2
		fi
		tar -cvP --bzip2 --same-owner -f $save_dir/js.$1.tar.bz2 $user_dir >> $JS_LOG
	else
		echo $user_dir tidak ada >> $JS_LOG
	fi
}

cmd_help()
{
	basename $0
	echo $versi
	echo "===============================
jagasama adalah program untuk mempertahankan kesamaan isi 'home' direktori
pengguna.
Penggunaan: jagasama [AKSI]
dg AKSI:
  save    menyimpan/membuat berkas cadangan direktori pengguna yg dinyatakan di
          berkas /etc/jagasama.conf
  resave PENGUNA   menyimpan/membuat berkas cadangan direktori PENGGUNA
  start   mengembalikan isi direktori pengguna saat startup
  reload  mengembalikan isi direktori pengguna saat login
  stop    tidak melakukan apa-apa :D
  help    tampilan ini

"
	exit
}

#read_config USERS
date >> $JS_LOG

case $opsi in
start) cmd_start;;
reload | restart) cmd_reload;;
save) cmd_save;;
resave) cmd_resave $2;;
help) cmd_help;;
stop)
echo 'stoping...' >> $JS_LOG
esac
echo end. >> $JS_LOG
if [ $siapasaya = root ]
then
chmod 666 $JS_LOG
fi
exit


